/**
 * @author : GD
 * @date :2021/12/20 : 22:48
 */
package com.petter.lock.juc.semaphore;
/**
 链接：https://www.pdai.tech/md/java/thread/java-thread-x-juc-tool-semaphore.html


 重点：
 1. release会添加令牌，并不会以初始化的大小为准。
 2. Semaphore中release方法的调用并没有限制要在acquire后调用。

 什么是Semaphore?
> Semaphore称为计数信号量，它允许n个任务同时访问某个资源，可以将信号量看做是在向外分发使用资源的许可证，只有成功获取许可证，才能使用资源。
 Semaphore内部原理?
 > Semaphore底层是基于AbstractQueuedSynchronizer来实现的。
 Semaphore常用方法有哪些?
 semaphore.acquire(x);
 semaphore.release(x);
 //x 默认为1
 如何实现线程同步和互斥的?
 Semaphore适合用在什么场景?
 > 许可，文件读取等
 单独使用Semaphore是不会使用到AQS的条件队列?
 > 不同于CyclicBarrier和ReentrantLock，单独使用Semaphore是不会使用到AQS的条件队列的，其实，只有进行await操作才会进入条件队列，其他的都是在同步队列中，只是当前线程会被park。
 Semaphore中申请令牌(acquire)、释放令牌(release)的实现?

 Semaphore初始化有10个令牌，11个线程同时各调用1次acquire方法，会发生什么?
 > 拿不到令牌的线程阻塞，不会继续往下运行。
 Semaphore初始化有10个令牌，一个线程重复调用11次acquire方法，会发生什么?
 > 最后一次线程阻塞，不会继续往下运行。可能你会考虑类似于锁的重入的问题，很好，但是，令牌没有重入的概念。你只要调用一次acquire方法，就需要有一个令牌才能继续运行。
 Semaphore初始化有1个令牌，1个线程调用一次acquire方法，然后调用两次release方法，之后另外一个线程调用acquire(2)方法，此线程能够获取到足够的令牌并继续运行吗?
 > 能，原因是release方法会添加令牌，并不会以初始化的大小为准。
 Semaphore初始化有2个令牌，一个线程调用1次release方法，然后一次性获取3个令牌，会获取到吗?
 > 能，原因是release会添加令牌，并不会以初始化的大小为准。Semaphore中release方法的调用并没有限制要在acquire后调用。

 *
 *
 */
